/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servidor;

import Entidades.Asignacion;
import Entidades.Curso;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author imarban
 */
class ServerAsignacion extends Thread{
    
    String driver = "com.mysql.jdbc.Driver";
    String usuario = "root";
    String clave = "root";
    String urlDB = "jdbc:mysql://localhost/Escuela";
    
    private Socket socketCliente = null;
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;
    int codigoOperacion;
    
    Connection cnn;
    PreparedStatement pst;
    ResultSet rs;
    ResultSetMetaData rsMetaData;
    
    public ServerAsignacion(Socket socketCliente, ObjectInputStream ois, ObjectOutputStream oos){
        this.socketCliente = socketCliente;
        System.out.println("Inicialice el serverAsignacion");
        try {
            this.oos = oos;
            this.ois = ois;            
            } catch (Exception ioe) {
            System.out.println(ioe.getMessage());
            throw new RuntimeException();
        }start();
    }

    @Override
    public void run() {
        try {
            codigoOperacion = ois.readInt();
            System.out.println("Lei un codigo de " + codigoOperacion);
            switch(codigoOperacion)
            {
                case Constantes.AGREGAR:
                    agregarAsignacion();
                    break;
                case Constantes.MODIFICAR:
                    modificarAsignacion();
                    break;
                case Constantes.ELIMINAR: 
                    eliminarAsignacion();
                    break;
                case Constantes.CONSULTAR_UNO: 
                    enviarAsignacion();
                    break;
                case Constantes.CONSULTAR_TODOS: 
                    enviarListaAsignaciones();
                    break;
            }
        } catch (IOException e) {
        }
        
           
    } 



    private void enviarListaAsignaciones() {
        List<Asignacion> asignaciones = new ArrayList<Asignacion>();
        conectarBD();
        try {
            System.out.println("Leere el identificador");
            int idAlumno = ois.readInt();
            System.out.println("Lei el identificador " +idAlumno);
            pst = cnn.prepareStatement("SELECT * FROM Asignacion where idAlumno = ?");
            pst.setInt(1, idAlumno);
            rs = pst.executeQuery();
            System.out.println("Ejecute el query");
            while(rs.next())
            {
                asignaciones.add(new Asignacion(rs.getInt(1), rs.getInt(2), rs.getString(3), 
                        rs.getInt(4)));
            }
            
            System.out.println("Cree la lista");
             oos.writeObject(asignaciones);
             System.out.println("Escribi la lista");
            oos.flush();
            
        } catch (Exception e) {
        }
    }
    
    private void enviarAsignacion()
    {
        int idCurso;
        int idAlumno;
        Curso curso;
        conectarBD();
        
        try{
            idCurso = ois.readInt();
            idAlumno = ois.readInt();
            pst = cnn.prepareStatement("SELECT * FROM Curso WHERE idCurso = ? AND idAlumno = ?");
            pst.setInt(1, idCurso);
            pst.setInt(2, idAlumno);
            rs = pst.executeQuery();
            rs.first();
            curso = new Curso(rs.getInt(1), rs.getString(2), rs.getString(3), 
                        rs.getString(4), rs.getFloat(5));
            
            oos.writeObject(curso);
            oos.flush();
        } catch (IOException | SQLException  e){
            
        }
    }

    private void agregarAsignacion() {
        
        conectarBD();
        try {
            pst = cnn.prepareStatement("INSERT INTO Asignacion VALUES (?,?,?,?)");    
        } catch (SQLException sqle) {
        }
   
        try {
            Asignacion asignacion = (Asignacion)ois.readObject();
            System.out.println("id alumno" + asignacion.getIdAlumno());
            pst.setInt(1, asignacion.getIdAlumno());
            System.out.println("id curso" + asignacion.getIdCurso());
            pst.setInt(2, asignacion.getIdCurso());
            System.out.println("horario" + asignacion.getHorario());
            pst.setString(3, asignacion.getHorario());
            System.out.println("tipo" + asignacion.getTipoC());
            pst.setInt(4, asignacion.getTipoC());
            
            pst.executeUpdate();
            oos.writeBoolean(true);
            System.out.println("Imprimi boolean");
        } catch (ClassNotFoundException | IOException  | SQLException cnfe) {
            try {
                oos.writeBoolean(false);
            } catch (Exception e) {
            }
            System.err.println(cnfe.getMessage());
            throw new RuntimeException();
        }
        
    }
    
    private void modificarAsignacion()
    {
        int idCurso;
        int idAlumno;
        
        Asignacion asignacion = null;
        try {
            idCurso = ois.readInt();    
            idAlumno = ois.readInt();
            conectarBD();
            pst = cnn.prepareStatement("SELECT * FROM Curso where idCurso = ? AND idAlumno = ?");
            pst.setInt(1, idCurso);
            pst.setInt(2, idAlumno);
            rs = pst.executeQuery();
            
            oos.writeObject(new Curso(rs.getInt(1), rs.getString(2), rs.getString(3), 
                        rs.getString(4), rs.getFloat(5)));
            
            asignacion = (Asignacion) ois.readObject();
            pst = cnn.prepareStatement("UPDATE Asignacion SET horario =  ?, tipoCurso = ? WHERE idCurso = ? AND idAlumno = ?");
            
            pst.setString(1, asignacion.getHorario());
            pst.setInt(2, asignacion.getTipoC());
            pst.setInt(3, asignacion.getIdCurso());
            pst.setInt(4, asignacion.getIdAlumno());
            
            pst.executeUpdate();
            
        } catch (IOException | ClassNotFoundException | SQLException ioe) {
            System.err.println(ioe.getMessage());
            throw new RuntimeException();
        }

    }
    
    private void eliminarAsignacion(){
        int idCurso;
        int idAlumno;
        try {
            idCurso = ois.readInt();    
            idAlumno = ois.readInt();
            pst = cnn.prepareStatement("DELETE FROM Asignacion WHERE idCurso = ? AND idAlumno = ?");
            pst.setInt(1, idCurso);
            pst.setInt(2, idAlumno);
            pst.executeUpdate();
        } catch (IOException | SQLException ioe) {
            System.err.println(ioe.getMessage());
            throw new RuntimeException();
        }
    }
        
    private void conectarBD()
    {
         try {
            Class.forName(driver);
            cnn = DriverManager.getConnection(urlDB, usuario, clave);
         } catch (SQLException | ClassNotFoundException sqle){
             System.err.println(sqle.getMessage());
         }
    }
    
    
        
}
